From f3f5a896de2ce9bb7661ae70ce7cd69d19299994 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 22 Jan 2019 18:44:34 -0500 Subject: [PATCH] box: Avoid position in the reorder api Change the reorder api to insert after a sibling, so that moving to first place becomes reorder (... NULL). And add a insert_after api that can replace the common container_add / reorder_after (... NULL) combination. Update all callers. --- docs/reference/gtk/gtk4-sections.txt | 3 +- gtk/gtkactionbar.c | 6 +- gtk/gtkassistant.c | 19 +++- gtk/gtkbbox.c | 4 +- gtk/gtkbox.c | 146 ++++++++++++++------------- gtk/gtkbox.h | 10 +- gtk/gtkcolorchooserwidget.c | 3 +- gtk/gtkcombobox.c | 7 +- gtk/gtkfilechooserwidget.c | 9 +- gtk/gtkheaderbar.c | 2 +- gtk/gtkmenusectionbox.c | 20 ++-- gtk/gtkmodelmenuitem.c | 3 +- gtk/gtknotebook.c | 15 +-- gtk/gtkscalebutton.c | 11 +- gtk/gtkspinbutton.c | 8 +- gtk/gtkstackswitcher.c | 11 +- gtk/gtktreeviewcolumn.c | 4 +- 17 files changed, 150 insertions(+), 131 deletions(-) diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index b2faa749db..353de84d48 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -323,9 +323,10 @@ gtk_box_get_homogeneous gtk_box_set_homogeneous gtk_box_get_spacing gtk_box_set_spacing -gtk_box_reorder_child gtk_box_get_baseline_position gtk_box_set_baseline_position +gtk_box_insert_child_after +gtk_box_reorder_child_after GTK_BOX GTK_IS_BOX diff --git a/gtk/gtkactionbar.c b/gtk/gtkactionbar.c index 039e22ddd0..f54308d611 100644 --- a/gtk/gtkactionbar.c +++ b/gtk/gtkactionbar.c @@ -210,8 +210,7 @@ gtk_action_bar_set_child_property (GtkContainer *container, { g_object_ref (child); gtk_container_remove (GTK_CONTAINER (priv->start_box), child); - gtk_container_add (GTK_CONTAINER (priv->end_box), child); - gtk_box_reorder_child (GTK_BOX (priv->end_box), child, 0); + gtk_box_insert_child_after (GTK_BOX (priv->end_box), child, NULL); g_object_unref (child); } } @@ -479,8 +478,7 @@ gtk_action_bar_pack_end (GtkActionBar *action_bar, { GtkActionBarPrivate *priv = gtk_action_bar_get_instance_private (action_bar); - gtk_container_add (GTK_CONTAINER (priv->end_box), child); - gtk_box_reorder_child (GTK_BOX (priv->end_box), child, 0); + gtk_box_insert_child_after (GTK_BOX (priv->end_box), child, NULL); } /** diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c index 39b0a6ccbd..81d632d909 100644 --- a/gtk/gtkassistant.c +++ b/gtk/gtkassistant.c @@ -1125,7 +1125,7 @@ gtk_assistant_init (GtkAssistant *assistant) buttons = gtk_container_get_children (GTK_CONTAINER (priv->action_area)); for (l = buttons; l; l = l->next) - gtk_box_reorder_child (GTK_BOX (priv->action_area), GTK_WIDGET (l->data), -1); + gtk_box_reorder_child_after (GTK_BOX (priv->action_area), GTK_WIDGET (l->data), NULL); g_list_free (buttons); } @@ -1644,6 +1644,7 @@ gtk_assistant_insert_page (GtkAssistant *assistant, gint n_pages; GtkStyleContext *context; GtkWidget *box; + GtkWidget *sibling; g_return_val_if_fail (GTK_IS_ASSISTANT (assistant), 0); g_return_val_if_fail (GTK_IS_WIDGET (page), 0); @@ -1686,10 +1687,18 @@ gtk_assistant_insert_page (GtkAssistant *assistant, priv->pages = g_list_insert (priv->pages, page_info, position); - gtk_container_add (GTK_CONTAINER (priv->sidebar), page_info->regular_title); - gtk_container_add (GTK_CONTAINER (priv->sidebar), page_info->current_title); - gtk_box_reorder_child (GTK_BOX (priv->sidebar), page_info->regular_title, 2 * position); - gtk_box_reorder_child (GTK_BOX (priv->sidebar), page_info->current_title, 2 * position + 1); + if (position == 0) + sibling = NULL; + else + { + int i; + sibling = gtk_widget_get_first_child (priv->sidebar); + for (i = 1; i < 2 * position; i++) + sibling = gtk_widget_get_next_sibling (sibling); + } + + gtk_box_insert_child_after (GTK_BOX (priv->sidebar), page_info->current_title, sibling); + gtk_box_insert_child_after (GTK_BOX (priv->sidebar), page_info->regular_title, sibling); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_show (box); diff --git a/gtk/gtkbbox.c b/gtk/gtkbbox.c index fb3400675c..c9bccc0c6a 100644 --- a/gtk/gtkbbox.c +++ b/gtk/gtkbbox.c @@ -386,9 +386,7 @@ gtk_button_box_set_child_secondary (GtkButtonBox *widget, gtk_widget_child_notify (child, "secondary"); if (bbox->priv->layout_style == GTK_BUTTONBOX_EXPAND) - { - gtk_box_reorder_child (GTK_BOX (bbox), child, is_secondary ? 0 : -1); - } + gtk_box_reorder_child_after (GTK_BOX (bbox), child, is_secondary ? NULL : gtk_widget_get_last_child (GTK_WIDGET (bbox))); if (gtk_widget_get_visible (GTK_WIDGET (widget)) && gtk_widget_get_visible (child)) diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c index 4fc004b740..2e952a5af0 100644 --- a/gtk/gtkbox.c +++ b/gtk/gtkbox.c @@ -35,8 +35,9 @@ * the children to influence their allocation. * * Use repeated calls to gtk_container_add() to pack widgets into a - * GtkBox from start to end. Use gtk_container_remove() - * to remove widgets from the GtkBox. + * GtkBox from start to end. Use gtk_container_remove() to remove widgets + * from the GtkBox. gtk_box_insert_child_after() can be used to add a child + * at a particular position. * * Use gtk_box_set_homogeneous() to specify whether or not all children * of the GtkBox are forced to get the same amount of space. @@ -45,7 +46,7 @@ * minimally placed between all children in the GtkBox. Note that * spacing is added between the children. * - * Use gtk_box_reorder_child() to move a GtkBox child to a different + * Use gtk_box_reorder_child_after() to move a child to a different * place in the box. * * # CSS nodes @@ -1047,75 +1048,6 @@ gtk_box_get_baseline_position (GtkBox *box) return priv->baseline_pos; } -/** - * gtk_box_reorder_child: - * @box: a #GtkBox - * @child: the #GtkWidget to move - * @position: the new position for @child in the list of children - * of @box, starting from 0. If negative, indicates the end of - * the list - * - * Moves @child to a new @position in the list of @box children. - */ -void -gtk_box_reorder_child (GtkBox *box, - GtkWidget *child, - gint position) -{ - GtkWidget *widget; - - g_return_if_fail (GTK_IS_BOX (box)); - g_return_if_fail (GTK_IS_WIDGET (child)); - - widget = GTK_WIDGET (box); - - if (position == 0) - { - gtk_widget_insert_after (child, widget, NULL); - gtk_css_node_insert_after (gtk_widget_get_css_node (widget), - gtk_widget_get_css_node (child), - NULL); - } - else if (position < 0) - { - gtk_widget_insert_before (child, widget, NULL); - gtk_css_node_insert_before (gtk_widget_get_css_node (widget), - gtk_widget_get_css_node (child), - NULL); - } - else - { - int i = 0; - int old_pos = -1; - GtkWidget *p; - GtkWidget *new_next_sibling = NULL; - - - for (p = _gtk_widget_get_first_child (widget); - p != NULL; - p = _gtk_widget_get_next_sibling (p)) - { - if (p == child) - old_pos = i; - - if (i == position + 1) - { - new_next_sibling = p; - } - - i ++; - } - - if (position == old_pos) - return; - - gtk_widget_insert_before (child, widget, new_next_sibling); - gtk_css_node_insert_before (gtk_widget_get_css_node (widget), - gtk_widget_get_css_node (child), - new_next_sibling ? gtk_widget_get_css_node (new_next_sibling) : NULL); - } -} - static void gtk_box_add (GtkContainer *container, GtkWidget *child) @@ -1164,3 +1096,73 @@ _gtk_box_get_children (GtkBox *box) return g_list_reverse (retval); } + +/** + * gtk_box_insert_child_after: + * @box: a #GtkBox + * @child: the #GtkWidget to insert + * @sibling: (nullable): the sibling to move @child after, or %NULL + * + * Inserts @child in the position after @sibling in the list + * of @box children. If @sibling is %NULL, insert @child at + * the first position. + */ +void +gtk_box_insert_child_after (GtkBox *box, + GtkWidget *child, + GtkWidget *sibling) +{ + GtkWidget *widget = GTK_WIDGET (box); + + g_return_if_fail (GTK_IS_BOX (box)); + g_return_if_fail (GTK_IS_WIDGET (child)); + g_return_if_fail (gtk_widget_get_parent (child) == NULL); + if (sibling) + { + g_return_if_fail (GTK_IS_WIDGET (sibling)); + g_return_if_fail (gtk_widget_get_parent (sibling) == widget); + } + + if (child == sibling) + return; + + gtk_widget_insert_after (child, widget, sibling); + gtk_css_node_insert_after (gtk_widget_get_css_node (widget), + gtk_widget_get_css_node (child), + sibling ? gtk_widget_get_css_node (sibling) : NULL); +} + +/** + * gtk_box_reorder_child_after: + * @box: a #GtkBox + * @child: the #GtkWidget to move, must be a child of @box + * @sibling: (nullable): the sibling to move @child after, or %NULL + * + * Moves @child to the position after @sibling in the list + * of @box children. If @sibling is %NULL, move @child to + * the first position. + */ +void +gtk_box_reorder_child_after (GtkBox *box, + GtkWidget *child, + GtkWidget *sibling) +{ + GtkWidget *widget = GTK_WIDGET (box); + + g_return_if_fail (GTK_IS_BOX (box)); + g_return_if_fail (GTK_IS_WIDGET (child)); + g_return_if_fail (gtk_widget_get_parent (child) == widget); + if (sibling) + { + g_return_if_fail (GTK_IS_WIDGET (sibling)); + g_return_if_fail (gtk_widget_get_parent (sibling) == widget); + } + + if (child == sibling) + return; + + gtk_widget_insert_after (child, widget, sibling); + gtk_css_node_insert_after (gtk_widget_get_css_node (widget), + gtk_widget_get_css_node (child), + sibling ? gtk_widget_get_css_node (sibling) : NULL); +} diff --git a/gtk/gtkbox.h b/gtk/gtkbox.h index fd98927e2e..eb5146a15f 100644 --- a/gtk/gtkbox.h +++ b/gtk/gtkbox.h @@ -92,9 +92,15 @@ GDK_AVAILABLE_IN_ALL GtkBaselinePosition gtk_box_get_baseline_position (GtkBox *box); GDK_AVAILABLE_IN_ALL -void gtk_box_reorder_child (GtkBox *box, +void gtk_box_insert_child_after (GtkBox *box, + GtkWidget *child, + GtkWidget *sibling); + +GDK_AVAILABLE_IN_ALL +void gtk_box_reorder_child_after (GtkBox *box, GtkWidget *child, - gint position); + GtkWidget *sibling); + G_END_DECLS diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index 2afc0187cd..9f2d286017 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -745,8 +745,7 @@ add_custom_color (GtkColorChooserWidget *cc, gtk_color_swatch_set_can_drop (GTK_COLOR_SWATCH (p), TRUE); connect_custom_signals (p, cc); - gtk_container_add (GTK_CONTAINER (cc->priv->custom), p); - gtk_box_reorder_child (GTK_BOX (cc->priv->custom), p, 1); + gtk_box_insert_child_after (GTK_BOX (cc->priv->custom), p, gtk_widget_get_first_child (cc->priv->custom)); gtk_widget_show (p); select_swatch (cc, GTK_COLOR_SWATCH (p)); diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index 8adddcfe2f..b47ffe50f6 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -1156,9 +1156,7 @@ gtk_combo_box_create_child (GtkComboBox *combo_box) gtk_widget_set_hexpand (child, TRUE); gtk_cell_view_set_fit_model (GTK_CELL_VIEW (priv->cell_view), TRUE); gtk_cell_view_set_model (GTK_CELL_VIEW (priv->cell_view), priv->model); - gtk_container_add (GTK_CONTAINER (gtk_widget_get_parent (priv->arrow)), - priv->cell_view); - gtk_box_reorder_child (GTK_BOX (gtk_widget_get_parent (priv->arrow)), priv->cell_view, 0); + gtk_box_insert_child_after (GTK_BOX (gtk_widget_get_parent (priv->arrow)), priv->cell_view, NULL); _gtk_bin_set_child (GTK_BIN (combo_box), priv->cell_view); } } @@ -1193,8 +1191,7 @@ gtk_combo_box_add (GtkContainer *container, } gtk_widget_set_hexpand (widget, TRUE); - gtk_container_add (GTK_CONTAINER (priv->box), widget); - gtk_box_reorder_child (GTK_BOX (priv->box), widget, 0); + gtk_box_insert_child_after (GTK_BOX (priv->box), widget, NULL); _gtk_bin_set_child (GTK_BIN (container), widget); if (priv->has_entry) diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index d7ccf53e1d..d52fd98dfd 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -916,8 +916,7 @@ update_preview_widget_visibility (GtkFileChooserWidget *impl) if (!priv->preview_label) { priv->preview_label = gtk_label_new (priv->preview_display_name); - gtk_container_add (GTK_CONTAINER (priv->preview_box), priv->preview_label); - gtk_box_reorder_child (GTK_BOX (priv->preview_box), priv->preview_label, 0); + gtk_box_insert_child_after (GTK_BOX (priv->preview_box), priv->preview_label, NULL); gtk_label_set_ellipsize (GTK_LABEL (priv->preview_label), PANGO_ELLIPSIZE_MIDDLE); gtk_widget_show (priv->preview_label); } @@ -958,9 +957,6 @@ set_preview_widget (GtkFileChooserWidget *impl, { gtk_widget_show (priv->preview_widget); gtk_container_add (GTK_CONTAINER (priv->preview_box), priv->preview_widget); - gtk_box_reorder_child (GTK_BOX (priv->preview_box), - priv->preview_widget, - (priv->use_preview_label && priv->preview_label) ? 1 : 0); } update_preview_widget_visibility (impl); @@ -2607,8 +2603,7 @@ save_widgets_create (GtkFileChooserWidget *impl) gtk_label_set_mnemonic_widget (GTK_LABEL (widget), priv->location_entry); priv->save_widgets = vbox; - gtk_container_add (GTK_CONTAINER (priv->box), priv->save_widgets); - gtk_box_reorder_child (GTK_BOX (priv->box), priv->save_widgets, 0); + gtk_box_insert_child_after (GTK_BOX (priv->box), priv->save_widgets, NULL); gtk_widget_show (priv->save_widgets); } diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index c86ea2757e..2cc15a1c14 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -470,7 +470,7 @@ _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar) gtk_container_add (GTK_CONTAINER (box), separator); if (i == 1) - gtk_box_reorder_child (GTK_BOX (box), separator, 0); + gtk_box_reorder_child_after (GTK_BOX (box), separator, NULL); if (i == 0) gtk_style_context_add_class (gtk_widget_get_style_context (box), GTK_STYLE_CLASS_LEFT); diff --git a/gtk/gtkmenusectionbox.c b/gtk/gtkmenusectionbox.c index 81aa08638d..f87259e3bb 100644 --- a/gtk/gtkmenusectionbox.c +++ b/gtk/gtkmenusectionbox.c @@ -134,10 +134,7 @@ gtk_menu_section_box_sync_separators (GtkMenuSectionBox *box, return; if (should_have_separator) - { - gtk_container_add (GTK_CONTAINER (box), box->separator); - gtk_box_reorder_child (GTK_BOX (box), box->separator, 0); - } + gtk_box_insert_child_after (GTK_BOX (box), box->separator, NULL); else gtk_container_remove (GTK_CONTAINER (box), box->separator); } @@ -333,7 +330,17 @@ gtk_menu_section_box_insert_func (GtkMenuTrackerItem *item, gtk_widget_set_halign (widget, GTK_ALIGN_FILL); gtk_container_add (GTK_CONTAINER (box->item_box), widget); - gtk_box_reorder_child (GTK_BOX (box->item_box), widget, position); + + if (position == 0) + gtk_box_reorder_child_after (GTK_BOX (box->item_box), widget, NULL); + else + { + GtkWidget *sibling = gtk_widget_get_first_child (GTK_WIDGET (box->item_box)); + int i; + for (i = 1; i < position; i++) + sibling = gtk_widget_get_next_sibling (sibling); + gtk_box_reorder_child_after (GTK_BOX (box->item_box), widget, sibling); + } gtk_menu_section_box_schedule_separator_sync (box); } @@ -457,8 +464,7 @@ gtk_menu_section_box_new_submenu (GtkMenuTrackerItem *item, g_object_set_data (G_OBJECT (button), "focus", focus); g_object_set_data (G_OBJECT (focus), "focus", button); - gtk_container_add (GTK_CONTAINER (box), button); - gtk_box_reorder_child (GTK_BOX (box), button, 0); + gtk_box_insert_child_after (GTK_BOX (box), button, NULL); g_signal_connect (focus, "clicked", G_CALLBACK (open_submenu), item); g_signal_connect (button, "clicked", G_CALLBACK (close_submenu), item); diff --git a/gtk/gtkmodelmenuitem.c b/gtk/gtkmodelmenuitem.c index ffa8ad9635..5d7637219f 100644 --- a/gtk/gtkmodelmenuitem.c +++ b/gtk/gtkmodelmenuitem.c @@ -191,8 +191,7 @@ gtk_model_menu_item_set_icon (GtkModelMenuItem *item, image = gtk_image_new_from_gicon (icon); gtk_image_set_pixel_size (GTK_IMAGE (image), 16); - gtk_container_add (GTK_CONTAINER (child), image); - gtk_box_reorder_child (GTK_BOX (child), image, 0); + gtk_box_insert_child_after (GTK_BOX (child), image, NULL); } g_object_notify (G_OBJECT (item), "icon"); diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index c3aa646546..8c52b52012 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -6204,7 +6204,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook) gtk_widget_set_hexpand (priv->header_widget, TRUE); gtk_widget_set_vexpand (priv->header_widget, FALSE); if (priv->show_tabs) - gtk_box_reorder_child (GTK_BOX (priv->box), priv->header_widget, 0); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->header_widget, NULL); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box), GTK_ORIENTATION_VERTICAL); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->header_widget), GTK_ORIENTATION_HORIZONTAL); @@ -6216,7 +6216,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook) gtk_widget_set_hexpand (priv->header_widget, TRUE); gtk_widget_set_vexpand (priv->header_widget, FALSE); if (priv->show_tabs) - gtk_box_reorder_child (GTK_BOX (priv->box), priv->header_widget, 1); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->header_widget, gtk_widget_get_last_child (priv->box)); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box), GTK_ORIENTATION_VERTICAL); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->header_widget), GTK_ORIENTATION_HORIZONTAL); @@ -6228,7 +6228,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook) gtk_widget_set_hexpand (priv->header_widget, FALSE); gtk_widget_set_vexpand (priv->header_widget, TRUE); if (priv->show_tabs) - gtk_box_reorder_child (GTK_BOX (priv->box), priv->header_widget, 0); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->header_widget, NULL); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box), GTK_ORIENTATION_HORIZONTAL); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->header_widget), GTK_ORIENTATION_VERTICAL); @@ -6240,7 +6240,7 @@ gtk_notebook_update_tab_pos (GtkNotebook *notebook) gtk_widget_set_hexpand (priv->header_widget, FALSE); gtk_widget_set_vexpand (priv->header_widget, TRUE); if (priv->show_tabs) - gtk_box_reorder_child (GTK_BOX (priv->box), priv->header_widget, 1); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->header_widget, gtk_widget_get_last_child (priv->box)); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box), GTK_ORIENTATION_HORIZONTAL); gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->header_widget), GTK_ORIENTATION_VERTICAL); @@ -7147,10 +7147,11 @@ gtk_notebook_set_action_widget (GtkNotebook *notebook, if (widget) { - int pos = pack_type == GTK_PACK_START ? 0 : -1; - gtk_container_add (GTK_CONTAINER (priv->header_widget), widget); - gtk_box_reorder_child (GTK_BOX (priv->header_widget), widget, pos); + if (pack_type == GTK_PACK_START) + gtk_box_reorder_child_after (GTK_BOX (priv->header_widget), widget, NULL); + else + gtk_box_reorder_child_after (GTK_BOX (priv->header_widget), widget, gtk_widget_get_last_child (priv->header_widget)); gtk_widget_set_child_visible (widget, priv->show_tabs); } diff --git a/gtk/gtkscalebutton.c b/gtk/gtkscalebutton.c index 9102b333c1..c7b8a4865a 100644 --- a/gtk/gtkscalebutton.c +++ b/gtk/gtkscalebutton.c @@ -727,16 +727,13 @@ apply_orientation (GtkScaleButton *button, if (orientation == GTK_ORIENTATION_HORIZONTAL) { - gtk_box_reorder_child (GTK_BOX (priv->box), priv->scale, 0); - gtk_box_reorder_child (GTK_BOX (priv->box), priv->minus_button, 1); - gtk_box_reorder_child (GTK_BOX (priv->box), priv->plus_button, 2); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->plus_button, NULL); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->scale, NULL); } else { - gtk_box_reorder_child (GTK_BOX (priv->box), priv->scale, 1); - gtk_box_reorder_child (GTK_BOX (priv->box), priv->minus_button, 2); - gtk_box_reorder_child (GTK_BOX (priv->box), priv->plus_button, 0); - + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->scale, NULL); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->plus_button, NULL); } gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->scale), orientation); diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 52c9a78df2..181b91cd48 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -868,6 +868,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button) priv->box = gtk_box_new (priv->orientation, 0); gtk_widget_set_parent (priv->box, GTK_WIDGET (spin_button)); + priv->entry = gtk_entry_new (); gtk_entry_set_width_chars (GTK_ENTRY (priv->entry), 0); gtk_entry_set_max_width_chars (GTK_ENTRY (priv->entry), 0); @@ -1051,13 +1052,14 @@ gtk_spin_button_set_orientation (GtkSpinButton *spin, if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { /* Current orientation of the box is vertical! */ - gtk_box_reorder_child (GTK_BOX (priv->box), priv->entry, 0); - gtk_box_reorder_child (GTK_BOX (priv->box), priv->down_button, 1); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->up_button, NULL); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->entry, NULL); } else { /* Current orientation of the box is horizontal! */ - gtk_box_reorder_child (GTK_BOX (priv->box), priv->up_button, 0); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->entry, NULL); + gtk_box_reorder_child_after (GTK_BOX (priv->box), priv->up_button, NULL); } gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->box), priv->orientation); diff --git a/gtk/gtkstackswitcher.c b/gtk/gtkstackswitcher.c index 53faf59b05..50cdcecb55 100644 --- a/gtk/gtkstackswitcher.c +++ b/gtk/gtkstackswitcher.c @@ -235,7 +235,16 @@ on_position_updated (GtkWidget *widget, "position", &position, NULL); - gtk_box_reorder_child (GTK_BOX (self), button, position); + if (position == 0) + gtk_box_reorder_child_after (GTK_BOX (self), button, NULL); + else + { + GtkWidget *sibling = gtk_widget_get_first_child (GTK_WIDGET (self)); + int i; + for (i = 1; i < position; i++) + sibling = gtk_widget_get_next_sibling (sibling); + gtk_box_reorder_child_after (GTK_BOX (self), button, sibling); + } } static void diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 338d691d38..aa730c8f9b 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -964,9 +964,9 @@ gtk_tree_view_column_update_button (GtkTreeViewColumn *tree_column) * reverse things */ if (priv->xalign <= 0.5) - gtk_box_reorder_child (GTK_BOX (hbox), arrow, 1); + gtk_box_reorder_child_after (GTK_BOX (hbox), arrow, gtk_widget_get_last_child (hbox)); else - gtk_box_reorder_child (GTK_BOX (hbox), arrow, 0); + gtk_box_reorder_child_after (GTK_BOX (hbox), arrow, NULL); if (priv->show_sort_indicator || (GTK_IS_TREE_SORTABLE (model) && priv->sort_column_id >= 0)) -- 2.30.2